package main

import (
	"fmt"
)

//接口
//定义一些通用规范，只设计规范而不实现规范
/* 定义接口 */
// type interface_name interface {
// 	method_name1 [return_type]
// 	method_name2 [return_type]
// 	method_name3 [return_type]
// 	...
// 	method_namen [return_type]
//  }

/* 定义结构体 */
//  type struct_name struct {
// 	/* variables */
//  }

/* 实现接口方法 */
//  func (struct_name_variable struct_name) method_name1() [return_type] {
// 	/* 方法实现 */
//  }
//  ...
//  func (struct_name_variable struct_name) method_namen() [return_type] {
// 	/* 方法实现*/
//  }

//实现接口必须实现接口中的所有方法 - 否则会报错

//实例
//USB接口
// type USB interface {
// 	read()
// 	write()
// }
// type Computer struct {
// }
// type Mobile struct {
// }

// //Computer实现USB接口方法
// func (c Computer) read() {
// 	fmt.Println("computer read...")
// }
// func (c Computer) write() {
// 	fmt.Println("computer write...")
// }

// //Mobile实现USB接口方法
// func (c Mobile) read() {
// 	fmt.Println("mobile read...")
// }
// func (c Mobile) write() {
// 	fmt.Println("mobile write...")
// }
// func main() {
// 	c := Computer{}
// 	m := Mobile{}
// 	c.read()
// 	c.write()
// 	m.read()
// 	m.read()
// }

// 接口值类型接收者和指针类型接收者
type Pet interface {
	eat()
}
type Dog struct {
	name string
}

// 实现Pet接口（接收者是值类型 - 不会改变
// func (dog Dog) eat() {
// 	fmt.Printf("dog: %p\n", &dog) //dog: 0xc00005e260
// 	fmt.Println("dog eat...")
// 	dog.name = "黑黑"
// }
// func main() {
// 	dog := Dog{name: "花花"}
// 	fmt.Printf("dog: %p\n", &dog)//dog: 0xc00005e250
// 	dog.eat()
// 	fmt.Printf("dog: %v\n", dog) //dog: {花花}
// }

// 实现Pet接口（接收者是指针类型 - 改变
func (dog *Dog) eat() {
	fmt.Printf("dog: %p\n", dog) //dog: 0xc00005e250
	fmt.Println("dog eat...")
	dog.name = "黑黑"
}

// func main() {
// 	dog := &Dog{name: "花花"}
// 	fmt.Printf("dog: %p\n", dog) //dog: 0xc00005e250
// 	dog.eat()
// 	fmt.Printf("dog: %v\n", dog) //dog: &{黑黑}
// }
